#include "jeu.h"

Jeu::Jeu(QWidget *parent) : QWidget(parent)
{
    emplacementDefense = 0;
    nbVies = 9;
    nbCredits = 50;
    vague = 0;
    vagueLancee = false;
    setLayout(new QHBoxLayout);
/*
    plateau.setParent(this);
    menu.setParent(this);
*/
    layout()->addWidget(&plateau);
    layout()->addWidget(&menu);
    menu.numVies.display(nbVies);
    menu.eau.setDisabled(true);
    menu.pierre.setDisabled(true);
    menu.peinture.setDisabled(true);
    menu.petanque.setDisabled(true);
    menu.musique.setDisabled(true);

    QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(avancer()));
    QObject::connect(&menu.pause, SIGNAL(clicked()), this, SLOT(startpause()));
    QObject::connect(&menu.lancerVague, SIGNAL(clicked()), this, SLOT(lancerVague()));
    QObject::connect(&plateau, SIGNAL(mouse(QPointF)), this, SLOT(mouse(QPointF)));
    QObject::connect(&menu.eau, SIGNAL(clicked()), this, SLOT(eau()));
    QObject::connect(&menu.pierre, SIGNAL(clicked()), this, SLOT(pierre()));
    QObject::connect(&menu.peinture, SIGNAL(clicked()), this, SLOT(peinture()));
    QObject::connect(&menu.petanque, SIGNAL(clicked()), this, SLOT(petanque()));
    QObject::connect(&menu.musique, SIGNAL(clicked()), this, SLOT(petanque()));

    Vague::charger_vagues("Ressources/waves.txt",vagues);
    charger_map("Ressources/map.txt");
    menu.vague.setText(vagues.at(vague).getNom());
    startpause();
}
void Jeu::eau()
{
    if (nbCredits >= Eau::getCout(0))
    {
        defenses.append(new Eau(this));
        nbCredits -= Eau::getCout(0);
    }
}
void Jeu::pierre()
{
    if (nbCredits >= Pierre::getCout(0))
    {
        defenses.append(new Pierre(this));
        nbCredits -= Pierre::getCout(0);
    }
}
void Jeu::peinture()
{

}
void Jeu::petanque()
{

}
void Jeu::musique()
{

}
void Jeu::mouse(QPointF p)
{
    int x = (p.x()+64)/128;
    int y = (p.y()+64)/128;
    if (x >= 0 && y >= 0 && x < 16 && y < 16)
    {
        Case& c = *map[y][x];
        if (c.getHerbe())
        {
            if (emplacementDefense != 0) plateau.scene()->removeItem(emplacementDefense);
            emplacementDefense = plateau.scene()->addRect(x*128-64,y*128-64,128,128);
            creerDefense = QPoint(x*128,y*128);
            menu.eau.setDisabled(false);
            menu.pierre.setDisabled(false);
            menu.peinture.setDisabled(false);
            menu.petanque.setDisabled(false);
            menu.musique.setDisabled(false);
        }
    }
}


void Jeu::avancer()
{
    menu.numVies.display(nbVies);
    menu.numCredits.display(nbCredits);
    for (int i = 0; i < ennemis.size(); i++)
    {
        Ennemi* e = ennemis[i];
        Case& c = *map[round(e->y()/128)][round(e->x()/128)];
        if (e->getHP() <= 0)
        {
            ennemis.remove(i);
            nbCredits++;
            menu.numCredits.display(nbCredits);
        }
        if (c.getArrivee())
        {
            ennemis.remove(i);
            perdreVie();
        }
    }
    if (vagueLancee)
    {
        const Vague& w = vagues.at(vague);

        //qDebug() << w.getNom();
        if (ennemiVague < w.getEnnemis().size())
        {
            const EnnemisVague& ev = w.getEnnemis().at(ennemiVague);
            if (nbennemiVague < ev.getNb()) // Il reste des ennemis de ce type a générer
            {
                if (compteurVague < ev.getDelai())
                {
                    compteurVague++;
                }
                else
                {
                    compteurVague = 0;
                    nbennemiVague++;
                    if (ev.getType() == "fourmi") new Fourmi(this, ev.getTaille());
                    if (ev.getType() == "cafard") new Cafard(this, ev.getTaille());

                    qDebug() << "Produire un ennemi de type" << ev.getType() << " et de taille " << ev.getTaille();
                }
            }
            else // On passe au prochain type d'ennemi
            {
                nbennemiVague = 0;
                ennemiVague++;
            }

        }
        else // Vague terminée
        {
            vague++;
            vagueLancee = false;
            menu.vague.setText(vagues.at(vague).getNom());
            menu.lancerVague.setDisabled(false);
        }
    }
    plateau.scene()->advance();
}

void Jeu::lancerVague()
{
    menu.lancerVague.setDisabled(true);
    ennemiVague = 0;
    nbennemiVague = 0;
    compteurVague = 0;
    vagueLancee = true;
}

void Jeu::startpause()
{
    if (timer.isActive())
    {
        timer.stop();
        menu.pause.setText("Reprendre");
    }
    else
    {
        //plateau.getTemps().restart();
        timer.start(20); // 1000/20 = 50 FPS
        menu.pause.setText("Pause");
    }
}
void Jeu::perdreVie()
{
    nbVies--;
    menu.numVies.display(nbVies);
    if (nbVies == 0)
    {
        // TODO : Réinitialiser...
    }
}
void Jeu::charger_map(QString fichier)
{
    QFile fileMap(fichier);

    int l = 0;
    QString line;
    QStringList listLine;

    if (!fileMap.open(QIODevice::ReadOnly | QIODevice::Text)) return;
    map.reserve(16);
    while (!fileMap.atEnd())
    {
            line = fileMap.readLine();
            listLine=line.split("\t");
            map.push_back(QVector<Case*>());
            map.back().reserve(16);
            for (int c=0;c<listLine.size();c++)
            {
                Case* x = new Case(listLine.at(c).toInt());
                map.back().push_back(x);
                plateau.scene()->addItem(x);

                x->setPos(128*c,128*l);
                x->setOffset(-64,-64);
                if (x->getDepart()) depart = QPoint(c,l);
                //qDebug() << "additem, depart = " << c << "," << l;
            }
            l++;

    }
    fileMap.close();
}
